package avaliacao.DAO;

import avaliacao.DTO.DTOAvaliacao;
import avaliacao.DTO.DTOAvaliador;
import avaliacao.DTO.DTOQuestion;
import avaliacao.DTO.DTOUniversidade;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class DAOAvaliacao extends DAO {

    static final String TB_AVALIACAO = "formulario";
    static final String CL_AVALIACAO_ID = "id_formulario";
    static final String CL_ESCOLA_ID = "id_escola";
    static final String CL_AVALIADOR_ID = "id_avaliador";
    static final String CL_PERGUNTA_ID = "id_perg";
    static final String CL_RESPOSTA_ID = "id_resp";

    static final String TB_PERGUNTAS = "perguntas";
    static final String CL_PERGUNTAS_ID = "id_perg";
    static final String CL_PERGUNTAS_NOME = "nome_perg";

    static final String TB_RESPOSTAS = "respostas_possiveis";
    static final String CL_RESPOSTAS_ID = "id_resp";
    static final String CL_RESPOSTAS_NOME = "nome_resp";

    static final String TB_AVALIADOR = "respostas_possiveis";
    static final String CL_AVALIADOR2_ID = "id_resp";
    static final String CL_AVALIADOR_NOME = "nome_avaliador";

    static final String TB_ESCOLA = "escola";
    static final String CL_ESCOLA2_ID = "id_escola";
    static final String CL_ESCOLA_NOME = "nome";

    public DTOAvaliacao getAvaliacao(DTOAvaliador avaliador,
            DTOUniversidade univ,
            int offset, int limit) {
        DTOAvaliacao avaliacao = new DTOAvaliacao();
        DTOQuestion quest;

        PreparedStatement pst;
        ResultSet rs;

        try {
            Connection con = getConnection();

            pst = con.prepareStatement("SELECT * FROM " + TB_AVALIACAO
                    + "INNER JOIN " + TB_PERGUNTAS + " ON "
                    + TB_AVALIACAO + "." + CL_PERGUNTA_ID + "="
                    + TB_PERGUNTAS + "." + CL_PERGUNTAS_ID
                    + "INNER JOIN " + TB_RESPOSTAS + " ON "
                    + TB_AVALIACAO + "." + CL_RESPOSTA_ID + "="
                    + TB_RESPOSTAS + "." + CL_RESPOSTAS_ID
                    + "INNER JOIN " + TB_AVALIADOR + " ON "
                    + TB_AVALIACAO + "." + CL_AVALIADOR_ID + "="
                    + TB_AVALIADOR + "." + CL_AVALIADOR2_ID
                    + "INNER JOIN " + TB_ESCOLA + " ON "
                    + TB_AVALIACAO + "." + CL_ESCOLA_ID + "="
                    + TB_ESCOLA + "." + CL_ESCOLA2_ID
                    + " WHERE "
                    + TB_AVALIACAO + "." + CL_AVALIADOR_ID + " = ? AND "
                    + TB_AVALIACAO + "." + CL_ESCOLA_ID + " = ?"
                    + "OFFSET ? LIMIT ?;");

            pst.setInt(1, avaliador.getID());
            pst.setInt(2, univ.getId());
            pst.setInt(3, offset);
            pst.setInt(4, limit);

            rs = pst.executeQuery();

            while (rs.next()) {
                avaliacao.setM_id(rs.getInt(CL_AVALIACAO_ID));

                avaliador = new DTOAvaliador();
                avaliador.setID(rs.getInt(CL_AVALIADOR_ID));
                avaliador.setNome(rs.getString(TB_AVALIADOR+"."+CL_AVALIADOR_NOME));
                avaliacao.setM_avaliador(avaliador);

                univ = new DTOUniversidade();
                univ.setId(rs.getInt(CL_ESCOLA_ID));
                univ.setNome(rs.getString(TB_ESCOLA+"."+CL_ESCOLA_NOME));
                avaliacao.setM_escola(univ);

                quest = new DTOQuestion();
                quest.setM_id_pergunta(rs.getInt(CL_PERGUNTA_ID));
                quest.setM_pergunta(rs.getString(TB_PERGUNTAS+"."+CL_PERGUNTAS_NOME));
                quest.setM_id_resposta(rs.getInt(CL_RESPOSTA_ID));
                quest.setM_resposta(rs.getString(TB_RESPOSTAS+"."+CL_RESPOSTAS_NOME));
                avaliacao.addQuestion(quest);
            }

            con.close();
            return avaliacao;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public ArrayList<DTOQuestion> getPerguntas(int offset, int limit){
        DTOQuestion quest;
        ArrayList<DTOQuestion> list = new ArrayList<DTOQuestion>();

        PreparedStatement pst;
        ResultSet rs;

        try {
            Connection con = getConnection();

            pst = con.prepareStatement("SELECT * FROM " + TB_PERGUNTAS
                    + "OFFSET ? LIMIT ?;");

            pst.setInt(1, offset);
            pst.setInt(2, limit);

            rs = pst.executeQuery();

            while (rs.next()) {
                quest = new DTOQuestion();
                quest.setM_id_pergunta(rs.getInt(CL_PERGUNTAS_ID));
                quest.setM_pergunta(rs.getString(CL_PERGUNTAS_NOME));

                list.add(quest);
            }

            con.close();
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}